class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n=nums.size();int sum=0;
        //分别数组的最大子数组和和最小子数组和
        int _max=INT_MIN;int _min=INT_MAX;
        for(auto &x:nums)sum+=x;
        vector<int>dp1(n+1);
        auto dp2=dp1;
        for(int i=1;i<=n;i++)
        {
            dp1[i]=max(dp1[i-1]+nums[i-1],nums[i-1]);
            _max=max(_max,dp1[i]);
            dp2[i]=min(dp2[i-1]+nums[i-1],nums[i-1]);
            _min=min(_min,dp2[i]);
        }
        if(_min==sum)return _max;
        return max(_max,sum-_min);
    }
};
